package br.uniceub.fsw.academicmobile.control;

import br.uniceub.fsw.academicmobile.dao.AlunoDAO;
import br.uniceub.fsw.academicmobile.dao.AulaDAO;
import br.uniceub.fsw.academicmobile.dao.FrequenciaDAO;
import br.uniceub.fsw.academicmobile.dao.HistoricoDAO;
import br.uniceub.fsw.academicmobile.dao.TurmaDAO;
import br.uniceub.fsw.academicmobile.vo.AlunoVO;
import br.uniceub.fsw.academicmobile.vo.AulaVO;
import br.uniceub.fsw.academicmobile.vo.FrequenciaVO;
import br.uniceub.fsw.academicmobile.vo.HistoricoVO;
import br.uniceub.fsw.academicmobile.vo.TurmaVO;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;

/**
 * Classe de negócio que gerencia as funcionalidades de aula
 * @author Christian Miranda
 */
public class AulaBO {

    private TurmaVO turma;
    private TurmaDAO daoTurma;
    private AulaDAO daoAula;
    private AulaVO aula;
    private SimpleDateFormat formatoTela = new SimpleDateFormat("dd/MM/yyyy");
    private Date data;
    private FrequenciaVO frequencia;
    private FrequenciaDAO daoFrequencia;
    private AlunoDAO daoAluno;
    private AlunoVO aluno;
    private HistoricoVO historico;
    private HistoricoDAO daoHistorico;
    
    /**
     * Metodo de interação com a tela
     * @param request dados do formulario
     * @return String dados para a tela
     */
    public String operacao(HttpServletRequest request){
        String retorno ="";
        if(request.getParameter("operacao") != null){
            if(request.getParameter("operacao").equals("inserir")){
                return "alert('"+incluir(request)+"')";
            }
            if(request.getParameter("operacao").equals("alterar")){
                return "alert('"+alterar(request)+"')";
            }
            if(request.getParameter("operacao").equals("excluir")){
                return "alert('"+excluir(request)+"')";
            }
        }
        return retorno;
    }
    
    /**
     * Retorna uma String contendo o código HTML das aulas
     * @param request dados do formulario
     * @return String com codigo da tabela
     */
    public String getTabelaAulas(HttpServletRequest request){
        daoTurma = new TurmaDAO();
        daoAula = new AulaDAO();
        data = new Date();
        if(request.getParameter("cbmes")!=null){
            data.setMonth(new Integer(request.getParameter("cbmes")));
        } else {
            data.setMonth(data.getMonth());
        }
        ArrayList listaAulas = new ArrayList();
        if(request.getParameter("cbTurma") == null){
            turma = (TurmaVO) request.getSession().getAttribute("turma");
        } else {
            turma = new TurmaVO();
            turma.setIdTurma(new Integer(request.getParameter("cbTurma")));
            turma = daoTurma.consultarTurmaPorId(turma);
            request.getSession().setAttribute("turma", turma);
        }
        
        StringBuffer sb = new StringBuffer("<form name='formulario' action='manterAula.jsp' method='post'>" );
        sb.append(getComboMes(turma, data.getMonth()+1));
        sb.append("</form>");
        sb.append("<div align='left'>"+turma.getDisciplina().getNoDisciplina()+" "+ 
                turma.getSgTurma()+"</div><br/>");
        listaAulas = daoAula.consultarAulaPorMesTurma(data.getMonth() +1,turma);
        if(listaAulas.size()==0){
            sb.append("Nenhuma aula para essa turma nesse mês");
        } else {
        sb.append("<table><tr><td>Identificador</td><td>Data da aula (dd/mm/aaaa)" +
                "</td><td> &nbsp;</td></tr>");
        for(int i=0;i<listaAulas.size();i++){
            aula = (AulaVO) listaAulas.get(i);
            sb.append("<form method='post' OnSubmit='return validar(this)'>" +
                    "<tr><td><input type='text' value='"+aula.getIdAula()+"' name='idAula' readonly/></td>" +
                    "<td><input type='text' value='"+formatoTela.format(aula.getDtAula())+"' name='dtAula'/></td>" +
                    "<td><input type='submit' value='alterar' onclick='operacao.value=\"alterar\"' />" +
                    "<input type='submit' value='excluir' onclick='operacao.value=\"excluir\"' />" +
                    "<input type='hidden' name='operacao' value='x'></td></tr></form>");
        }
        sb.append("</table>");
        }
        return sb.toString();
    }
    
    /**
     * Altera os dados da aula
     * @param request dados do formulario
     * @return String com status da operação
     */
    private String alterar(HttpServletRequest request){
        String retorno="Aula alterada com sucesso";
        aula = new AulaVO();
        daoAula = new AulaDAO();
        aula.setIdAula(new Integer(request.getParameter("idAula")));
        aula = daoAula.ConsultarAulaPorId(aula);        
        try {
            aula.setDtAula((Date) formatoTela.parse(request.getParameter("dtAula")));
        } catch (ParseException ex) {
            Logger.getLogger(AulaBO.class.getName()).log(Level.SEVERE, null, ex);
        }
        // Verifica se há outra aula para essa turma nessa data
        if(daoAula.consultarAulaPorDataTurma(aula)!=null){
            retorno = "Ja existe outra aula para essa turma nessa data";
        } else {
            if(daoAula.alterarAula(aula)==false){
                retorno = "erro na alteração da aula";
            }
        }
        return retorno;
    }
    
    /**
     * Inclui uma nova aula
     * @param request dados do formulário
     * @return String com status da operação
     */
    private String incluir(HttpServletRequest request){
        // criacao da aula
        String retorno="Aula incluida com sucesso";
        turma = (TurmaVO) request.getSession().getAttribute("turma");
        aula = new AulaVO();
        frequencia = new FrequenciaVO();
        daoAula = new AulaDAO();
        daoAluno = new AlunoDAO();
        daoHistorico = new HistoricoDAO();
        daoFrequencia = new FrequenciaDAO();
        try {
            aula.setDtAula((Date) formatoTela.parse(request.getParameter("dtAula")));
            aula.setTeAula(request.getParameter("teAula"));
        } catch (ParseException ex) {
            Logger.getLogger(AulaBO.class.getName()).log(Level.SEVERE, null, ex);
        }
        aula.setTbTurmaIdTurma(turma.getIdTurma());
        //verificar se ja existe uma aula nessa data
        if(daoAula.consultarAulaPorDataTurma(aula)!=null){
            retorno = "Ja existe uma aula nessa data";
        } else {
            if(!daoAula.incluirAula(aula)){
                retorno = "Falha na incluisao da aula";
            } else {
                //identificacao do historico dos alunos da turma e criacao das frequencias
                ArrayList listaAlunos = daoAluno.consultarAlunoPorTurma(turma);
                Iterator itAlunos = listaAlunos.iterator();
                while(itAlunos.hasNext()){
                    aluno = (AlunoVO) itAlunos.next();
                    historico = daoHistorico.consultarHistoricoPorTurmaAluno(turma, aluno);
                    aula = daoAula.consultarAulaPorDataTurma(aula);
                    frequencia.setTbAulaIdAula(aula.getIdAula());
                    frequencia.setTbHistoricoIdHistorico(historico.getIdHistorico());
                    frequencia.setTpFrequencia1("P");
                    frequencia.setTpFrequencia2("P");
                    if(!daoFrequencia.incluirFrequencia(frequencia)){
                        retorno = "Falha na incluisao da aula";
                    }
                }
            }
        }
        return retorno;
    }
    
    /**
     * Exclui nova aula
     * @param request dados do formulário
     * @return String com status da operação
     */
    private String excluir(HttpServletRequest request){
        String retorno = "Aula excluída com sucesso";
        turma = (TurmaVO) request.getSession().getAttribute("turma");
        aula = new AulaVO();
        daoAluno = new AlunoDAO();
        daoAula = new AulaDAO();
        daoHistorico = new HistoricoDAO();
        daoFrequencia = new FrequenciaDAO();
        aula.setIdAula(new Integer(request.getParameter("idAula")));
        ArrayList listaAlunos = daoAluno.consultarAlunoPorTurma(turma);
        Iterator itAlunos = listaAlunos.iterator();
            while(itAlunos.hasNext()){
                aluno = (AlunoVO) itAlunos.next();
                historico = daoHistorico.consultarHistoricoPorTurmaAluno(turma, aluno);
                frequencia = daoFrequencia.getFrequenciaPorHistoricoAula(historico, aula);
                if(daoFrequencia.excluirFrequencia(frequencia)==false){
                    retorno = "Falha na exclusão da aula";
                } else {
                    if(daoAula.excluirAula(aula)==false){
                        retorno = "Falha na exclusão da aula";
                    }
                }
            }
        return retorno;
    }
    
    /**
     * Retorna o código HTML de uma ComboBox de meses de acordo com o semestre
     * @param turma vo com id da turma onde será vista 
     * @param  mes numero do mes que aparecerá selecionado na combo 
     * @return String com o código da combo
     */
    public String getComboMes(TurmaVO turma, int mes){
            StringBuffer sb = new StringBuffer();
            sb.append("<SELECT NAME='cbmes' onchange='mudaData()'>");
            String[] selected = new String[11];
            for(int i=0;i<selected.length;i++){
                selected[i] = "";
                if((i + 2)== mes){
                    selected[i] = "SELECTED";
                }
            }
            
            if(turma.getNrSemestre()==1){
                sb.append("<OPTION "+selected[0]+" VALUE='01'>Fevereiro</OPTION>");
                sb.append("<OPTION "+selected[1]+" VALUE='02'>Marco</OPTION>");
                sb.append("<OPTION "+selected[2]+" VALUE='03'>Abril</OPTION>");
                sb.append("<OPTION "+selected[3]+" VALUE='04'>Maio</OPTION>");
                sb.append("<OPTION "+selected[4]+" VALUE='05'>Junho</OPTION>");
                sb.append("<OPTION "+selected[5]+" VALUE='06'>Julho</OPTION>");
            } else {
                sb.append("<OPTION "+selected[6]+" VALUE='07'>Agosto</OPTION>");
                sb.append("<OPTION "+selected[7]+" VALUE='08'>Setembro</OPTION>");
                sb.append("<OPTION "+selected[8]+" VALUE='09'>Outubro</OPTION>");
                sb.append("<OPTION "+selected[9]+" VALUE='10'>Novembro</OPTION>");
                sb.append("<OPTION "+selected[10]+" VALUE='11'>Dezembro</OPTION>");
            }
            sb.append("</SELECT>");
            return sb.toString();
        }
}
